#include <algorithm>
#include <functional>
#include <numeric>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <cassert>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <bitset>
#include <sstream>

using namespace std;

#define fore(i, l, r) for(int i = int(l); i < int(r); ++i)
#define forn(i, n) fore(i, 0, n)
#define fori(i, l, r) fore(i, l, (r) + 1)
#define sz(v) int((v).size())
#define all(v) (v).begin(), (v).end()
#define pb push_back
#define mp make_pair
#define X first
#define Y second

template<typename T> inline T abs(T a){ return ((a < 0) ? -a : a); }
template<typename T> inline T sqr(T a){ return a * a; }

typedef long long li;
typedef double ld;
typedef pair<int, int> pt;

const ld EPS = 1e-9;

ld readLd() {
	double x;
	assert(scanf("%lf", &x) == 1);
	return ld(x);
}

const int N = 100500;
int n;
ld a[N];
ld z[N];

const int MAGIC = 2;

bool solve() {
	assert(scanf("%d", &n) == 1);
	if (n == 0) return false;
	ld add = 0;
	forn(i, n) {
		a[i] = readLd();
		if (abs(a[i] - 1) < EPS) {
			add += 1;
			i--; n--;
		}
	}
	z[n] = 0;
	for (int i = n - 1; i >= 0; i--) {
		// x = (1 + x) * (1 - a[i]) + (2 + x) * a[i] * (1 - a[i + 1]) + ... + a[i] * ... *  a[j] * (j - i + 1 + z[j + 1])
		ld kx = 1;
		ld pro = 1;
		ld rg = 0;
		z[i] = 1e100;
		for (int j = i; j < min(i + MAGIC, n); j++) {
			kx -= pro * (1 - a[j]);
			rg += (j - i + 1) * pro * (1 - a[j]);
			pro *= a[j];
			// cerr << i << ' ' << j << ' ' << kx << ' ' << rg << ' ' << pro << ' ' << z[j + 1] << endl;
			// cerr << (rg + pro * (j - i + 1 + z[j + 1] + (j + 1 < n) ? 1 : 0)) << endl;
			ld cur = (rg + pro * (j - i + 1 + z[j + 1] + ((j + 1 < n) ? 1 : 0))) / kx;
			z[i] = min(z[i], cur);
		}
	}
	printf("%.10lf\n", double(z[0] + add));
	return true;
}

int main() {
	while (solve()) {}
	return 0;
}

